<?php
/**
 * Lớp cơ sở cho mapping các đối tượng từ database
 */

class ModelBase extends Database
{
    protected $table;

    public function __construct($table)
    {
        $this->table = strtolower($table);
        parent::__construct();
    }

    /**
     * Đếm số dòng dữ liệu trong bảng
     *
     * @return mixed
     */
    public function count()
    {
        return $this->executeScalar('SELECT COUNT(*) FROM ' . $this->table);
    }

    /**
     * Lấy về danh sách dữ liệu của bảng
     *
     * @return array|bool|int
     */
    public function  listAll()
    {
        return $this->select();
    }

    public function listLimit($start, $count)
    {
        return $this->run('SELECT * FROM ' . $this->table . ' LIMIT ' . $start . ',' . $count . ';');
    }

    /**
     * Lấy dữ liệu từ bảng dữ liệu
     *
     * @param string $where  điều kiện
     * @param string $bind   parameter
     * @param string $fields các trường cần lấy
     *
     * @return array|bool|int
     */
    public function select($where = '', $bind = '', $fields = '*')
    {
        $sql = "SELECT {$fields} FROM {$this->table}";

        if (!empty($where)) {
            $sql .= " WHERE {$where}";
        }
        $sql .= ';';
        return $this->run($sql, $bind);
    }

    /**
     * Cập nhật dữ liệu
     *
     * @param        $info
     * @param        $where
     * @param string $bind
     *
     * @return array|bool|int
     */
    public function update($info, $where, $bind = '')
    {
        $fields = $this->filter($this->table, $info);
        $sql = "UPDATE {$this->table} SET";
        foreach ($fields as $field) {
            $sql .= " {$field} = :update_{$field},";
        }
        $sql = preg_replace('/^(.+),$/', '$1', $sql);
        $sql .= " WHERE {$where};";

        $bind = $this->cleanup($bind);
        foreach ($fields as $field) {
            $bind[":update_{$field}"] = $info[$field];
        }
        return $this->run($sql, $bind);
    }

    /**
     * @param $info
     *
     * @return array|bool|int
     */
    public function insert($info)
    {
        $fields = $this->filter($this->table, $info);
        $sql = sprintf(
            "INSERT INTO {$this->table}(%s) VALUES(:%s)",
            implode($fields, ', '), implode($fields, ', :')
        );
        $bind = array();
        foreach ($fields as $field) {
            $bind[":{$field}"] = $info[$field];
        }
        return $this->run($sql, $bind);
    }

    public function delete($where, $bind = "")
    {
        $sql = "DELETE FROM {$this->table} WHERE {$where};";
        $this->run($sql, $bind);
    }
}
